from datetime import datetime
from hashlib import sha256

from flask import Blueprint, render_template, request, jsonify
from app.models import User, Movie

# 创建蓝图（name="main", url_prefix=""表示根路径）
main_bp = Blueprint("main", __name__, url_prefix="/")


@main_bp.context_processor
def inject_vars():
    """注入全局变量到所有模板中"""
    return {'current_year': datetime.now().year}  # 注入当前年份（用于模板底部版权信息等）


@main_bp.route('/')
@main_bp.route('/home')
@main_bp.route('/index')
def index():
    """首页/电影列表页：支持3个访问路径（/、/home、/index）"""
    # 查询所有电影，按ID倒序排列（最新添加的电影在前）
    movies = Movie.query.order_by(Movie.id.desc()).all()
    # 格式化电影数据为字典列表（避免直接传递ORM对象到模板，更安全）
    formatted_movies = [{
        'id': m.id, 'title': m.title, 'year': m.year,
        'genre': m.genre, 'rating': m.rating,
        'poster_url': m.poster_url, 'description': m.description
    } for m in movies]
    # 渲染电影列表模板（模板路径：templates/pages/movies.html）
    return render_template('pages/movies.html', movies=formatted_movies)


@main_bp.route('/about')
def about():
    """关于页面：渲染关于网站的信息"""
    # 渲染关于页面模板（模板路径：templates/pages/about.html）
    return render_template('pages/about.html')


@main_bp.route('/movies', methods=['POST'])
def api_add_movie():
    """API接口：添加新电影（仅支持POST请求）"""
    # 获取前端传递的JSON数据 key:value
    data = request.json
    # 校验必填字段（title、year、genre、rating、poster_url）
    required_fields = ['title', 'year', 'genre', 'rating', 'poster_url']
    if not all(k in data for k in required_fields):
        # 缺少字段返回400错误（Bad Request）
        return jsonify({"status": "error", "msg": "缺少必填字段"}), 400

    # 创建电影实例（description字段可选，默认值为"暂无介绍"）
    movie = Movie(
        title=data['title'],
        year=data['year'],
        genre=data['genre'],
        rating=data['rating'],
        poster_url=data['poster_url'],
        description=data.get('description', '暂无介绍'),
        created_at=datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
        updated_at=datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    )
    # 提交到数据库缓存
    db.session.add(movie)
    db.session.commit()
    # 返回成功响应（包含新电影的ID）
    return jsonify({"status": "success", "id": movie.id})


@main_bp.route('/users', methods=['POST'])
def api_add_user():
    """API接口：添加新用户（仅支持POST请求）"""
    # 获取前端传递的JSON数据
    data = request.json
    # 校验必填字段（username、email、password）
    required_fields = ['username', 'email', 'password']
    if not all(field in data for field in required_fields):
        return jsonify({"status": "error", "msg": "缺少必填字段"}), 400

    # 密码哈希处理（简单sha256加密，生产环境建议用werkzeug.security.generate_password_hash）
    password_hash = f"hash_{sha256(data['password'].encode()).hexdigest()}"

    # 创建用户实例
    user = User(
        username=data['username'],
        email=data['email'],
        password_hash=password_hash,
        created_at=datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    )

    try:
        # 提交到数据库（捕获唯一性冲突等异常）
        db.session.add(user)
        db.session.commit()
        # 成功返回201状态码（Created）
        return jsonify({
            "status": "success",
            "msg": "用户创建成功",
            "user_id": user.id
        }), 201
    except Exception as e:
        # 异常时回滚会话，避免数据不一致
        db.session.rollback()
        # 返回错误信息（包含异常详情）
        return jsonify({"status": "error", "msg": f"创建失败：{str(e)}"}), 400
